﻿/*
Stylish Select 0.4.1 - $ plugin to replace a select drop down box with a stylable unordered list
http://github.com/sko77sun/Stylish-Select

Requires: jQuery 1.3 or newer

Contributions from Justin Beasley: http://www.harvest.org/ & Anatoly Ressin: http://www.artazor.lv/

Dual licensed under the MIT and GPL licenses.

*/
(function(a) { a("html").addClass("stylish-select"); Array.prototype.indexOf = function(c, d) { for (var b = (d || 0); b < this.length; b++) { if (this[b] == c) { return b } } }; a.fn.extend({ getSetSSValue: function(b) { if (b) { a(this).val(b).change(); return this } else { return a(this).find(":selected").val() } }, resetSS: function() { var b = a(this).data("ssOpts"); $this = a(this); $this.next().remove(); $this.unbind(".sSelect").sSelect(b) } }); a.fn.sSelect = function(b) { return this.each(function() { var i = { defaultText: "Please select", animationSpeed: 0, ddMaxHeight: "", containerClass: "" }; var l = a.extend(i, b), e = a(this), j = a('<div class="selectedTxt"></div>'), r = a('<div class="newListSelected ' + l.containerClass + '"></div>'), z = a('<ul class="newList" style="visibility:hidden;"></ul>'), t = -1, d = -1, m = [], w = false, v = false, x; a(this).data("ssOpts", b); r.insertAfter(e); r.attr("tabindex", e.attr("tabindex") || "0"); j.prependTo(r); z.appendTo(r); e.hide(); j.data("ssReRender", !j.is(":visible")); if (e.children("optgroup").length == 0) { e.children().each(function(B) { var C = a(this).html(); var A = a(this).val(); m.push(C.charAt(0).toLowerCase()); if (a(this).attr("selected") == true) { l.defaultText = C; d = B } z.append(a('<li><a href="JavaScript:void(0);">' + C + "</a></li>").data("key", A)) }); x = z.children().children() } else { e.children("optgroup").each(function() { var A = a(this).attr("label"), C = a('<li class="newListOptionTitle">' + A + "</li>"); C.appendTo(z); var B = a("<ul></ul>"); B.appendTo(C); a(this).children().each(function() { ++t; var E = a(this).html(); var D = a(this).val(); m.push(E.charAt(0).toLowerCase()); if (a(this).attr("selected") == true) { l.defaultText = E; d = t } B.append(a('<li><a href="JavaScript:void(0);">' + E + "</a></li>").data("key", D)) }) }); x = z.find("ul li a") } var o = z.height(), n = r.height(), y = x.length; if (d != -1) { h(d, true) } else { j.text(l.defaultText) } function p() { var B = r.offset().top, A = jQuery(window).height(), C = jQuery(window).scrollTop(); if (o > parseInt(l.ddMaxHeight)) { o = parseInt(l.ddMaxHeight) } B = B - C; if (B + o >= A) { z.css({ top: "-" + o + "px", height: o }); e.onTop = true } else { z.css({ top: n + "px", height: o }); e.onTop = false } } p(); a(window).bind("resize.sSelect scroll.sSelect", p); function s() { r.css("position", "relative") } function c() { r.css("position", "static") } j.bind("click.sSelect", function(A) { A.stopPropagation(); if (a(this).data("ssReRender")) { o = z.height("").height(); n = r.height(); a(this).data("ssReRender", false); p() } a(".newList").not(a(this).next()).hide().parent().css("position", "static").removeClass("newListSelFocus"); z.toggle(); s(); x.eq(d).focus() }); x.bind("click.sSelect", function(B) { var A = a(B.target); d = x.index(A); v = true; h(d); z.hide(); r.css("position", "static") }); x.bind("mouseenter.sSelect", function(B) { var A = a(B.target); A.addClass("newListHover") }).bind("mouseleave.sSelect", function(B) { var A = a(B.target); A.removeClass("newListHover") }); function h(A, E) { x.removeClass("hiLite").eq(A).addClass("hiLite"); if (z.is(":visible")) { x.eq(A).focus() } var D = x.eq(A).html(); var C = x.eq(A).parent().data("key"); if (E == true) { e.val(C); j.text(D); return false } try { e.val(C) } catch (B) { e[0].selectedIndex = A } e.change(); j.text(D) } e.bind("change.sSelect", function(A) { $targetInput = a(A.target); if (v == true) { v = false; return false } $currentOpt = $targetInput.find(":selected"); d = $targetInput.find("option").index($currentOpt); h(d, true) }); function q(A) { a(A).unbind("keydown.sSelect").bind("keydown.sSelect", function(D) { var C = D.which; v = true; switch (C) { case 40: case 39: u(); return false; break; case 38: case 37: k(); return false; break; case 33: case 36: g(); return false; break; case 34: case 35: f(); return false; break; case 13: case 27: z.hide(); c(); return false; break } keyPressed = String.fromCharCode(C).toLowerCase(); var B = m.indexOf(keyPressed); if (typeof B != "undefined") { ++d; d = m.indexOf(keyPressed, d); if (d == -1 || d == null || w != keyPressed) { d = m.indexOf(keyPressed) } h(d); w = keyPressed; return false } }) } function u() { if (d < (y - 1)) { ++d; h(d) } } function k() { if (d > 0) { --d; h(d) } } function g() { d = 0; h(d) } function f() { d = y - 1; h(d) } r.bind("click.sSelect", function(A) { A.stopPropagation(); q(this) }); r.bind("focus.sSelect", function() { a(this).addClass("newListSelFocus"); q(this) }); r.bind("blur.sSelect", function() { a(this).removeClass("newListSelFocus") }); a(document).bind("click.sSelect", function() { r.removeClass("newListSelFocus"); z.hide(); c() }); j.bind("mouseenter.sSelect", function(B) { var A = a(B.target); A.parent().addClass("newListSelHover") }).bind("mouseleave.sSelect", function(B) { var A = a(B.target); A.parent().removeClass("newListSelHover") }); z.css({ left: "0", display: "none", visibility: "visible" }) }) } })(jQuery);